<?php

class Application_Model_BolaoMapper
{
    protected $_dbTable;

    public function setDBTable($tabelaBD)
    {
        if(is_string($tabelaBD)){
            $tabelaBD = new $tabelaBD();
        }
        if (!$tabelaBD instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Tabela invalida');
        }
        $this->_dbTable = $tabelaBD;
        return $this;
    }

    public function getDBTable()
    {
        if (null == $this->_dbTable) {
            $this->setDBTable('Application_Model_DbTable_Bolao');
        }
        return $this->_dbTable;
    }

    //provisorio, talvez não necessário.
    public function fetchAll()
    {

        $tabela = $this->getDBTable();

        $busca = $tabela->fetchAll();

        $resultado = array();

        foreach ($busca as $atual)
        {
            $resultado[] =  new Application_Model_Bolao($atual['nome']);
        }

        return $resultado;
    }

    public function salvar(Application_Model_Bolao $bolao)
    {
        $dadosParaSalvar = array(
            'id_jogo' => $bolao->get_id_jogo(),
            'nome' => $bolao->get_nome(),
            'email_criador' => $bolao->get_email_criador(),
            'importante' => $bolao->get_importante()
            );

        if ( null === ( $id = $bolao->get_id() ) ) {
            unset($dadosParaSalvar['id']);
            $this->getDbTable()->insert($dadosParaSalvar);
        } else {
            $this->getDbTable()->update($dadosParaSalvar, array('id = ?' => $id));
        }
    }

    public function findBolao($id)
    {
        $tabela = $this->getDBTable();

        $select = $tabela->find($id);

        if(count($select) == 0)
            return;

        $linha = $select->current();
        return (new Application_Model_Bolao($linha->id, $linha->id_jogo, $linha->nome, $linha->email_criador, $linha->importante));
    }

    /* Funcao para verificar se um jogo ja foi cadastrado no bolao.
     * Util apenas para verificar boloes a serem cadastrados por administradores.
     * retorno:
     *  qualquer numero (se jogo ja existe no banco de boloes)
     *  0 (caso  contrario)
     */
    public function jogoJaExiste($idJogo)
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('id_jogo = ?', $idJogo)
               ->where('email_criador is null');

        $busca = $tabela->fetchAll($select);
        return count($busca);
    }

    /* Funcao para verificar se um bolao com nome idêntico já existe para certo usuário.
     * Util apenas para verificar boloes a serem cadastrados por usuários.
     * retorno:
     *  qualquer numero (se bolao ja existe no banco de boloes)
     *  0 (caso  contrario)
     */
    public function nomeJaExiste($nomeBolao, $emailCriador)
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('nome = ?', $nomeBolao)
               ->where('email_criador = ?', $emailCriador);

        $busca = $tabela->fetchAll($select);
        return count($busca);
    }

    public function bolaoAdministrador($id_bolao)
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('id = ?', $id_bolao)
               ->where('email_criador is null');

        $busca = $tabela->fetchAll($select);
        
        return count($busca);
    }

    public function boloesAdministrador()
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('email_criador is null');

        $busca = $tabela->fetchAll($select);

        return $busca;
    }

    /*
     * Retorna o ID de um bolao dado seu nome e o email de quem o criou.
     */
    public function buscaIdBolaoPorNome($nome,$email)
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, 'id')
               ->where('email_criador = ?', $email)
               ->where('nome = ?', $nome);
        $busca = $tabela->fetchRow($select);

        return $busca->id;
    }

    /*
     * Retorna todos os bolões criados por um dado usuário.
     */
    public function buscaBolaoPorUsuario($emailUsuario)
    {
        $tabela = $this->getDBTable();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('email_criador = ?', $emailUsuario);
        $busca = $tabela->fetchAll($select);

        return $busca;
    }

    public function dadosBolao($id_boloes, $passou){
        
        $apostaMapper = new Application_Model_ApostaMapper();
        $jogoMapper = new Application_Model_JogoMapper();
        $jogo = new Application_Model_Jogo(NULL, NULL, NULL, NULL, NULL);
        $bolao = new Application_Model_Bolao(NULL, NULL, NULL, NULL, NULL);

        if($id_boloes == NULL) return;

        $tabela = $this->getDBTable();
        $resultado = array();
        
        foreach($id_boloes as $atual){
            $bolao = $this->findBolao($atual);
            $jogo = $jogoMapper->fetch_sem_data($bolao->get_id_jogo());

            $passou_data = $jogo->jaPassou();

            if($passou)
            {
                if(!$passou_data)
                {
                    continue;
                }
            }
            else
            {
                if($passou_data)
                {
                    continue;
                }
            }

            $string_partida = $jogo->getTimeA() . ' x ' . $jogo->getTimeB();
            $string_data = new Zend_Date($jogo->getData());
            $string_data = $string_data->toString('dd/MM/YYYY HH:mm:ss');
            $string_apostas = $apostaMapper->apostasEmBolao($atual);

            $resultado[] = array(
                        'id_bolao' => $bolao->get_id(),
                        'partida' => $string_partida,
                        'data' => $string_data,
                        'apostas' => $string_apostas
                );
        }
        return $resultado;
    }

    public function criadorBolao($id){
        if($id == NULL) return;
        $bolao = $this->findBolao($id);
        $criador = $bolao->get_email_criador();
        if($criador == NULL) $criador = 'administrador';
        return $criador;
    }

}//fim classe
